﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//这是我第一次半独立的写较为庞大的程序，涉及了我大部分的所学内容，注释是我当时留下的，用于提醒自己

void menu()//这是一个简易的游戏菜单
{
	printf("******************************\n");
	printf("******   1>“开始游玩”   ******\n");
	printf("******   2>“退出游戏”   ******\n");
	printf("******   3>“游戏设置”   ******\n");
	printf("******************************\n");

}

void game()//这个函数是游戏的主体，分出这个函数来写防止整体过于繁杂，步骤为首先生成随机数，其次给予反馈
		   //难点在于如何使用循环与选择提供合适的反馈，如何判断对错以及跳出循环
{
	int d = 0;//d为玩家猜测数字的变量
	int r = rand() % 100 + 1;//该函数可以生成为随机数，需要调用stdlib.h的头文件和更改相应种子
							 //()%100表示取得0~99的随机数，+1表示范围变为1~100
							 // r为rand生成的随机数，也是rand函数的返回值	
	//printf("%d\n", r);这是用来检验随机数生成是否成功，结果良好

	while(1)
	{
		printf("请输入您猜的数字：");
		int m =scanf("%d",&d);

		if (d != r)	
		{
			if (d > r)
			{
				printf("您猜的数字太  大  啦，再小一点\n ");
			}
			if (d < r) 
			{
				printf("您猜的数字太  小  啦，再大一点\n");
			}
		}
		else 
		{
			printf("恭喜您，答对了！数字就是%d!\n",r);
			printf("接下来转入菜单~\n");
			break;
		}
	}
}




int main()
{
	int a = 1;//a 为选择是否继续游玩的变量
	srand((unsigned int)time(NULL));//srand函数可以通过（）内部的数字改变rand的种子，而相应（）内的数字也应变化，由于时间一直在变，所以再调用time函数
									

	while (a)//此处有第一个错误，我把a写成了a=1，导致程序一直循环
	{
		menu();//将上面的菜单挪下来
		printf("请输入您的选择:>");//让玩家选择
		int ret = scanf("%d", &a);//a==1继续，a==2退出

		switch (a)//涉及多分支选择结构，使用switch更加简洁
		{
		case 1://此处为游戏主体
			printf("游戏开始咯，祝您游戏愉快~\n");
			
			game();//该部分主要实现生成随机数
			
			break;
		case 2:
			printf("游戏已退出，感谢您的游玩~\n");
			break;
		case 3:
			printf("啊这(⊙o⊙)…作者还未开发哦，请重新输入吧？\n");
			break;
		default:
			printf("您输入了个我不知道的选项呢，请重新输入吧？\n");
			break;

		}
		if (a == 2)//如果玩家退出游戏，需要令上面的while的表达式为假，因此这里选择if语句，若a==2，则令a=0
		{          //若是有其他数字，a则不为0，while表达式为真，程序则返回while语句继续循环
			a = 0;
		}                          //其实还有一个小bug，如果玩家输入了a==0，则会触发switch的default的分支，但由于a==0使while无法再循环
		else if (a == 0) { a = 1; }//所以我这里嵌套了一个if  else语句，若发生了上面的bug，会直接令a变成非零数，重新激活循环--写于11/9晚
	}
}